# 作用域: 变量生效的范围
# 全局变量: 函数外部定义的变量, 全局变量在函数内部和外部都可以使用
# 局部变量: 函数内部定义的变量, 局部变量只能在函数内部使用

n = 100


def change_value(a: int):
    n = a  # 内部创建的. 不会影响外部的 n
    print(f"n in change value {n}")  # 10


change_value(10)
print(f"n in external {n}")  # 100

print("-------------global----------------------")
# global
# 在函数内部修改全局变量的值,可以使用 global 关键字
# global: 将变量声明为全局变量
m = 100


def printValue():
    global h
    h = 101
    print(f"m in printValue {m}")


def change_value(a: int):
    global m

    m = a  # 内部创建的. 不会影响外部的 n
    print(f"n in change value {m}")  # 10
    print(f"h in change value {h}")  # 10


printValue()  # m in printValue 100
change_value(99)  # n in change value 99
print(f"n in external {m}")  # n in external 99
printValue()  # m in printValue 99


print("-------------nolocal----------------------")
# nolocal: 用来声明外层的局部变量, 只能在嵌套函数中使用,在外部函数先声明,内部函数进行nolocal声明
a = 10


def outer():
    a = 5  # 外部函数的局部变量
    print(f"outer a {a}")  # 5

    def inner():
        nonlocal a  #  声明要修改外部函数的变量
        a = 20
        print(f"inner a {a}")  # 20

        def inner2():
            nonlocal a
            a = 30
            print(f"inner2 a {a}")  # 30

        inner2()

    inner()
    print("outer aaaaaaaaaaaaaaaaa", a)  # # 输出 30, 外部变量已被修改


outer()
print(f"global a {a}")  # 10 nolocal 不会影响全局变量

print("-------------lambda 1----------------------")

# 匿名函数
# lambda 表达式
# 匿名函数: 没有函数名的函数,使用 lambda 关键字定义
add = lambda a, b: a + b  # a,b 是参数, a+b 是返回值
print(add(1, 2))  # 3

foo = lambda: "yes"
print(foo())  # yes

bar = lambda name: name
print(bar("leslie"))  # leslie

daz = lambda name, age=18: (name, age)
print(daz("leslie"))  # ('leslie', 10)
print(daz("leslie", 20))  # ('leslie', 20)

hax = lambda x, y, z=4: x + y + z
print(hax(1, 2))  # 7


def add_numbers(x: int, y: int) -> int:
    return x + y


add_numbers(10, 10)

jaz = lambda **kwargs: kwargs
print(jaz(name="leslie", age=22))  # {'name': 'leslie', 'age': 22}

print("-------------lambda 2----------------------")

# 三目运算符： true_result if 条件 else false_result
a = 5
b = 8

print("a < b") if a < b else print("a > b")

compare = lambda a, b: "a < b" if a < b else "a > b"
print(f"a:{a},b:{b}")
print(compare(a, b))
